package fr.adfm.paiement.processes;

import fr.adfm.paiement.data.ProcessContext;
import fr.adfm.ws.SC.WsServiceClientSC;
import fr.adfm.ws.SE.WsExpeditionSE;
import fr.adfm.ws.SP.WsPaiementSP;

public class PaiementProcess {
	
	private ProcessContext context;
	
	public PaiementProcess(ProcessContext context) {
		this.context = context;
	}
	
	public void Go() {
		
		WsExpeditionSE wsSE = new WsExpeditionSE(context);
		WsServiceClientSC wsSC = new WsServiceClientSC(context);
		WsPaiementSP wsSP = new WsPaiementSP(context);
		
		/**
		 * Validation du stock
		 */
		wsSE.validerStock();
		if(isException()) return;
		
		if(context.getContextSE().isStockOK) {
			
			// --- stock OK -----
			context.getOutput().setEtatFinal("StockOK");
			
			wsSP.ouvertureTransaction(context.getInput().getMontantEuros());
			if(isException()) {
				// --- ouverture transaction paiement KO -----
				context.getOutput().setEtatFinal("PaiementKO");
				wsSC.paiementInterrompu("Service banque indisponible");
				return;
			}
			
			// --- ouverture transaction paiement OK -----

			wsSC.setReferenceTransactionPaiement(context.getContextSP().noTransactionPaiement);
			isException();
			
			CallAsynPollingPaiement();
			
			context.getOutput().setUrlSitePaiement(context.getContextSP().infoRedirectionSitePaiement);
			context.getOutput().setEtatFinal("PaiementWaiting");
		}
		else
		{
			// --- stock KO ----- 
			
			context.getOutput().setEtatFinal("StockKO");	
			
			wsSC.paiementInterrompu("Stock insuffisant");
			isException();
		}
	}
	
	private void CallAsynPollingPaiement() {
		PaiementPollingProcess polling = new PaiementPollingProcess(context);
		polling.go();
	}
	
	private boolean isException() {
		if(context.getException() == null) return false;
		context.getOutput().setInformation(context.getException().getMessage());
		context.setException(null);
		return true;
	}
}
